<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button></button>
    <button></button>
    <button></button>
    <script>
        let btns=document.querySelectorAll('button');
        for(var index=0;index<btns.length;index++){
            btns[index].onclick=function(){
                console.log(index);  //3  因为var定义，var是全局变量，所以会导致变量泄漏用let就不会这样
            }

            // ~(function(index){  //用闭包就不会泄露
            //     btns[index].onclick=function(){
            //        console.log(index);
            //     }
            // })(index);
        }
        console.log(index);  //3  用let就不会这样
        //匿名函数自执行
        ~function(){}()  //~：为了防止语法错误而添加，也可以用括号把所有的包起来:(function(){})()  后面的():自执行


        /*
            1.函数嵌套函数
            2.子函数使用了父函数的变量
            3.子函数又被外界所应用

            闭包最大的作用是存值
        */
        function fn(){
            let a=1;
            return function sum(){
                return a++;
            }
        }

        let fn2=fn();  //闭包函数
        console.log(fn2());
        console.log(fn2());
        console.log(fn2());
        console.log(fn2());
    </script>
</body>
</html>